本发明提供一种Linux串口通信日志记录的方法,该方法通过在Linux内核中建立与应用层进行交互的数据通道,进而在应用层中通过已经建立的数据通道,获得Linux内核层中串口通信过程的详细信息,主要包括串口通信动作与串口通信数据等。本发明涉及的串口通信日志记录方法主要在Linux内核层中进行处理,这样可以在不影响串口通信的情况下,实现串口通信过程中的一种可靠的日志功能。另外,在应用层中提供了多个接口,因此可以根据实际的应用需求与特点,选择合适的数据通道类型、日志时间精度、连续时间间隔以及日志记录方案,从而使得记录的串口日志具有较高的可靠性和可读性,满足不同应用场景的需求。
1.一种Linux串口通信日志记录的方法,其特征在于,通过在Linux内核中建立与应用层进行交互的数据通道,进而在应用层中通过已经建立的数据通道获得Linux内核层中串口通信过程的数据信息,将这些数据信息经处理并写入到日志文件中而获得串口通信日志,在应用层中提供一个可配置时间间隔的选项,应用层进程根据实际应用环境,配置一个时间间隔作为阈值,并以该阈值作为判断前后两条同一类型的串口通信数据记录应该记录成一条还是两条。
2.如权利要求1所述的方法,其特征在于,在Linux内核中建立的与应用层之间通信的数据通道包括三条通道:procfs、sysfs和netfilter。
3.如权利要求2所述的方法,其特征在于,串口通信过程中的数据信息保存在Linux内核层的缓存中。
4.如权利要求3所述的方法,其特征在于,应用层进程根据应用层配置中选定的数据通道与内核进行通信,从而获得所述保存在Linux内核层缓存中的串口通信数据信息。
5.如权利要求4所述的方法,其特征在于,所述获得保存在Linux内核层缓存中的串口通信数据信息的步骤包括:(1)读入配置文件:Linux应用层程序读入配置文件,根据配置文件的内容确定将采用的数据通道、日志记录的时间精度、向日志记录文件进行写操作的时间间隔和日志记录的方式;(2)选择数据通道:根据读入配置文件中数据通道的配置选项,选择对应的数据通道;(3)读入串口数据:Linux应用层程序通过步骤(2)中选择的数据通道,从内核层中读入串口通信过程信息,将读入的内核数据存放到用户层中。
6.如权利要求4所述的方法,其特征在于,判断前后两条记录的数据类型是否都是读操作,若是,应用层进程根据实际应用环境在应用层配置中选择相应的时间间隔作为阈值,当前后两条同一类型的串口通信数据的时间间隔小于所述阈值时,将这两条通信数据记录为一条;否则将它们记录为两条。
7.如权利要求xa06所述的方法,其特征在于,判断前后两条记录的数据类型是否都是读操作,若否;或者在完成上述对两条同一类型的串口通信数据的时间间隔是否小于所述阈值的判断及记录后,应用层进程根据应用层配置中选定的数据格式和时间精度,转换保存在Linux内核层缓存中的串口通信数据信息的数据格式和获得数据信息的时间精度。
8.如权利要求7所述的方法,其特征在于,应用层进程根据应用层配置中所选定的日志记录的方式,将处理完的日志数据写入到日志文件中。
9.如权利要求5或8所述的方法,其特征在于,所述日志记录的方式包括三种:1不限日志文件容量的顺序记录方式:将所有的数据按照顺序写入日志文件,并且日志文件没有上限限制;2限制日志文件最大容量的循环记录方式:将串口数据写入日志文件,当日志文件超过配置上限时,将从日志文件的首部开始继续下去;3限制单日志文件大小的多文件顺序记录方式:将所有的数据按照顺序写入日志文件,当前日志文件中的大小超过配置上限时,将余下数据写入一个新的日志文件中。
技术领域本发明涉及串口通信领域,尤其是一种Linux串口通信日志记录的方法。
背景技术随着计算机系统的应用和微机网络的发展,计算机与外界的信息交换越来越显得重要。串口通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送。因此,串口通信特别适合于远距离的数据传输。如图1所示,一台工控机或者pc机上可能有多个串口,每一个串口分别与终端串口设备连接,这样组成了一对多的连接结构。每个终端串口设备通过串口与工控机或者pc机上的串口连接,进而与工控机或者pc机进行串口通信。在实际的串口通信应用中,为了检验串口通信过程的可靠性,往往需要能够在不影响串口正常通信的情况下,将串口通信的过程的信息(包括串口通信数据、串口通信动作等)以日志的方式记录下来。然而,在Linux平台下,串口通信过程中的数据具有“唯一性”,这里是指一次串口通信完成后,串口通信数据等将会被内核清空而无法保存。若在串口通信的具体应用程序中,将串口通信的数据预先复制一份,这样的话,一方面会影响串口通信的效率,另一方面该方案本身不具备任何的可移植性,也就是说,一旦串口通信的应用程序发生变化时,串口日志功能就需要在应用程序中重新开发。在串口通信过程中,Linux内核可能会把串口通信数据分割成很小的数据段,如果按照这种原始数据格式记录的话,一方面会使得日志可读性变得较差,另一方面与串口通信数据的实际时间节点不符。
发明内容基于上述原因,本发明旨在通过在Linux内核中建立与应用层进行交互的数据通道,进而在应用层中可以通过数据通道,获悉Linux内核层中串口通信过程的方式来实现串口通信日志的记录。本发明的总体构思是在不影响正常的串口通信过程的情况下,在内核层中建立与用户层进行交互的数据通道,进而在应用层中通过该数据通道获得Linux内核层中串口通信过程的信息,从而达到记录串口通信过程的目的。并且在应用层提供了配置接口,使得可以通过应用层选择合适的数据通道方式,从而满足实际应用环境的不同需求。本发明的目的是提供一种串口通信日志记录的方法,该日志记录的时间精度是可以根据实际应用环境中的不同需求,在应用层进行配置,精度范围是毫秒(ms)~微秒(μs)。具体是根据串口通信数据的实际应用情况,在应用层提供一个可以配置的时间间隔接口,当在前后两条同一类通信数据的时间间隔小于配置时间间隔的情况下,将这两条通信数据记录为一条,从而大大提高串口通信日志文件的可读性,而且与实际串口通信更加吻合。本发明采用的技术手段是:本发明通过在Linux内核中建立与应用层进行交互的数据通道,进而在应用层中通过已经建立的数据通道,获得Linux内核层中串口通信过程的详细信息,主要包括串口通信动作与串口通信数据等。其实现的方法包括以下步骤:1)建立Linux内核层与Linux应用层之间通信的三条数据通道:procfs、sysfs和netfilter(步骤S1);2)将串口通信过程中的数据等保存在Linux内核层的缓存中(步骤S2);3)应用层进程根据应用层中数据通道的选择配置,通过合适的数据通道与内核进行通信,从而获得保存在Linux内核层缓存中的串口通信数据(步骤S3);4)应用层进程根据应用层中日志时间精度、时间间隔的配置,将取得的串口通信数据进行进一步分析处理(步骤S4);5)应用层进程根据应用层中所选定的日志记录方案,将处理完的日志数据写入到日志文件中(步骤S5)。本发明提供三种日志记录方式:1不限日志文件容量的顺序记录方式;2限制日志文件最大容量的循环记录方式;3限制单日志文件大小的多文件顺序记录方式。所有上述日志记录方式可以在应用层配置中进行选定。本发明的在有益技术效果在于:本发明涉及的串口通信日志记录方法主要在Linux内核层中进行处理,这样可以在不影响串口通信的情况下,实现对串口通信过程的一种可靠的日志功能。而且,在应用层中提供了多个接口,因此可以根据实际的应用需求与特点,选择合适的数据通道类型、日志时间精度、连续时间间隔以及日志记录方案,从而使得记录的串口日志具有较高的可靠性和可读性,满足不同应用场景的需求。其中,本发明最典型的应用场景是对串口通信可靠性要求较高以及进行大量串口通信的Linux系统,如智能交通系统。
附图说明图1串口通信过程结构框图;图2为本发明Linux内核层与应用层数据通信的流程图;图3为本发明限制日志文件最大容量的循环记录方式的流程图。
具体实施方式为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。本发明涉及到的相关技术术语的名词解释:数据通道:是一种实现Linux内核层与应用层之间进行数据通信功能的一系列接口等。本发明中涉及到的数据通道主要有procfs、sysfs、netfilter三种方式。procfs:是进程文件系统。它提供用户以文件系统的方式为访问系统内核数据的操作提供接口,用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。sysfs:是在一种虚拟文件系统。它提供了在应用层中访问内核层中的设备(device)和驱动(driver)信息的接口。netfilter:是Linux内核集成的IP信息包过滤系统。它提供了在中断环境下内核层与应用层之间进程通信的方式。本发明通过在Linux内核中建立与应用层进行通信的数据通道,进而在应用层中通过已经建立的数据通道,获得Linux内核层中串口通信过程的详细信息(主要包括串口通信动作与串口通信数据等)的方式,实现Linux平台下串口通信过程的高效的并且真实可靠的日志记录。本发明的具体实施需要Linux内核层与Linux应用层的紧密结合,下面结合附图2来对本发明的工作原理流程作进一步说明。1)首先,Linux内核在初始化过程中将建立三条数据通道——procfs、sysfs和netfilter(步骤S1),用以在内核层与应用层之间建立可靠的联系,建立数据通道的方法主要是在内核中注册一系列的接口函数,这样可以实现在应用层中通过某些特定的系统调用获得内核层中的串口通信过程的信息。2)然后,Linux内核会将串口通信过程中的所有信息(包括串口通信数据和串口通信动作等)保存在Linux内核层缓存中的特定的数据结构中(步骤S2)。当Linux内核的准备工作完成后,Linux应用层中需要执行如下步骤:3)应用层进程根据应用层中数据通道的选择配置,通过合适的数据通道与内核进行通信,从而获得保存在Linux内核层缓存中的串口通信数据(步骤S3),具体包括以下步骤:(3.1)读入配置文件(步骤S301):Linux应用层程序读入配置文件,根据配置文件的内容确定将采用的数据通道、日志记录的时间精度、向日志记录文件进行写操作的时间间隔和日志的记录方式。(3.2)选择数据通道(步骤S302):根据读入配置文件中数据通道的配置选项,选择对应的数据通道(内核层中提供三种数据通道选择:procfs、sysfs和netfilter)。(3.3)读入串口数据(步骤S303):Linux应用层程序通过步骤S302中选择的数据通道,从内核层中读入串口通信过程信息,将读入的内核数据存放在用户层中。4)应用层进程根据应用层中日志时间精度、时间间隔的配置,将取得的串口通信数据进行进一步分析处理(步骤S4),具体包括以下步骤:(4.1)判断前后两条记录的数据类型是否都是读操作,若不是,则直接跳入下一步(步骤S402);若是,则处理前后两条串口数据时间间隔(步骤S401):在串口通信过程中,Linux内核可能会把串口通信数据分割成很小的数据段,如果按照这种原始数据格式记录的话,一方面会使得日志可读性变得较差,另一方面与串口通信数据的实际时间节点不符。因此,本发明在应用层中提供了一个可配置时间间隔的选项,应用层进程可以根据实际应用环境的不同,选择合适的时间间隔作为阈值。当满足前后两条同一类型的串口通信数据的时间间隔小于所述阈值的条件时,将这两条通信数据记录为一条;否则将它们记录为两条。这样,一方面可以提高串口通信日志文件的可读性,另一方面可以使得串口通信日志中的时间节点与串口通信的实际情况更加吻合。(4.2)转换时间精度(步骤S402):根据步骤S301中读入配置文件中的时间精度,将步骤S303中读入的内核串口通信数据中的时间转换成相应的时间精度。(4.3)处理数据格式(步骤S403):根据实际需求,将串口通信数据转换成合适的格式(如十六进制等)。5)应用层进程根据应用层中选定的日志记录方式,将处理完的日志数据写入到日志文件中(步骤S5)。具体是根据步骤S301中配置文件中的记录日志方式的配置选项,按照对应的方式将转换后的数据写入到日志文件中。由于在实际应用中,串口通信的数据量可能会很大,并且串口通信数据本身在经过较长一段时间以后有效性会降低。如果只是将所有的通信日志简单写到某个文件中,一段时间后可能会受到可用存储设备空间的限制;另外,如果单个日志文件过大会给日志中查找有用信息带来很大的麻烦。基于上述原因,本发明提供了三种日志记录方式:1不限日志文件容量的顺序记录方式:将所有的数据按照顺序写入日志文件,并且日志文件没有上限限制;2限制日志文件最大容量的循环记录方式:将串口数据写入日志文件,当日志文件超过配置上限时,将从日志文件的首部开始继续下去;3限制单日志文件大小的多文件顺序记录方式:将所有的数据按照顺序写入日志文件,当前日志文件中的大小超过配置上限时,将余下数据写入一个新的日志文件中。下面结合附图3,以限制日志文件最大容量的循环记录方式为例来说明其工作流程。限制日志文件最大容量的循环记录方式将在日志文件的第一行中记录当前下次要写入该日志的位置。首先,判断当前日志文件的首行是否有效(步骤S501),如果无效,则会清空当前日志文件,新建日志文件(步骤S502′)。然后确定本次应该写入的日志文件位置(步骤S502),判断在这个位置插入新的日志内容后,新的日志文件大小是否超过配置的日志文件大小上限(步骤S503),如果超过则跳转到日志文件头部继续写入日志文件(步骤S504);否则,从该位置继续写入(步骤S504′)。最后,在本次完成写入日志内容后,需要更新下次应当写入的日志文件位置(步骤S505)。本发明通过Linux内核层与Linux应用层的紧密结合,实现Linux平台下串口日志通信的安全可靠的日志记录。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。